#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include<functional>
// int main()
// {
//     std::cout << getpid() << std::endl;
//     int num = 0;
//     while(true)
//     {
//         num++;
//         std::cout << "循环中" << std::endl;
//         if(num == 10)
//         {
//             abort();
//         }
//         sleep(1);
//     }
// }
// long long num;
// void add(int sig)
// {
//     std::cout << "信号:" << sig << "num:" << num << std::endl;
//     exit(0);
// }
// int main()
// {
//     alarm(1);
//     std::cout << getpid() << std::endl;
//     signal(14, add);

//     while (true)
//     {

//         // std::cout << "循环中" << std::endl;
//         num++;
//         // std::cout<<"num:" << num << std::endl;
//         // sleep(1);
//     }
// }
// #include<vector>
// typedef std::function<void()> fun_c;
// std::vector<fun_c> fun;
// int num = 0;

// void add(int sig)
// {
//     for(auto& i:fun)
//     {
//         i();
//     }
//     std::cout << "num" << num << std::endl;
//     alarm(1);
// }

// int main()
// {
//     fun.push_back([](){std::cout << "内核刷新" << std::endl;});
//     fun.push_back([](){std::cout << "检查进程时间片" << std::endl;});
//     fun.push_back([](){std::cout << "内存管理操作" << std::endl;});
//     alarm(1);
//     signal(SIGALRM,add);
//     while(true)
//     {
//         num++;
//     }

//     return 0;
// }

// int num=0;
// void add(int sig)
// {
//     std::cout << "num:" << num << std::endl;
// }

// int main()
// {
//     signal(8,add);
//     // int* p =nullptr;
//     // *p = 11;
//     int a = 10;
//     a /= 0;
//     while(true)
//     {

//     }
//     return 0;
// }


void Printf(const sigset_t& pingblock)
{
    std::cout << "当前进程的block表:" << std::endl;
    for(int i=31;i>0;i--)
    {
        if(sigismember(&pingblock,i))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

int main()
{
    ::signal(2,SIG_IGN);

    sigset_t block,roblock;
    //清0
    ::sigemptyset(&block);
    ::sigemptyset(&roblock);
    //添加2号信号
    sigaddset(&block,2);
    //我们的block直接覆盖新增，将老的block表给roblock
    sigprocmask(SIG_SETMASK,&block,&roblock);
    int cur = 0;
    while(true)
    {
        sigset_t pingblock;
        sigpending(&pingblock);
        std::cout << "当前进程pid:" << getpid() << std::endl;
        Printf(pingblock);
        sleep(1);
        cur++;
        if(cur==15)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK,&roblock,nullptr);
            //exit(0);
        }
    }
    return 0;
}